Skip to content

perf(android): Speed up ViewUtils.findTarget by reducing allocations#5594

Draft
runningcode wants to merge 2 commits into
mainfrom
no/java-534-speed-up-viewutils-findtarget
Draft

perf(android): Speed up ViewUtils.findTarget by reducing allocations#5594
runningcode wants to merge 2 commits into
mainfrom
no/java-534-speed-up-viewutils-findtarget

Conversation

@runningcode

Copy link
Copy Markdown
Contributor

📜 Description

Replace the per-gesture LinkedList BFS queue with an ArrayDeque in ViewUtils.findTarget and ComposeGestureTargetLocator, and drop the intermediate list allocated when enqueuing Compose children.

ViewUtils.findTarget runs on every tap (onSingleTapUp) and at the start of every scroll (onScroll), traversing the view tree to locate the gesture target. The traversal used a LinkedList as its queue, which allocates a node object for every add/poll — i.e. one allocation per visited view, on the main thread, on every gesture. ArrayDeque is array-backed and allocates almost nothing per element. The Compose locator had the same LinkedList pattern plus an extra intermediate List allocated per node via .asMutableList().map { }.

Traversal order and target-selection logic are unchanged — this is an allocation/GC-pressure reduction only, not a behavior change.

💡 Motivation and Context

JAVA-534 / #5481. Reduce avoidable main-thread allocations in the gesture target traversal hot path.

Note on scope: profiling on a Pixel 3 (Android 12) shows the dominant CPU cost in findTarget is getLocationOnScreen (called per visited view), not the queue allocation. This PR is the low-risk allocation cleanup; the getLocationOnScreen cost is tracked as a separate follow-up.

💚 How did you test it?

Existing ViewUtilsTest and SentryGestureListener unit tests pass. Verified on-device (Pixel 3, Android 12) that gesture target resolution is unchanged — scroll target still resolves correctly (Scroll target found: scrolling_container).

📝 Checklist

  • I added GH Issue ID & Linear ID
  • I added tests to verify the changes.
  • No new PII added or SDK only sends newly added PII if sendDefaultPII is enabled.
  • I updated the docs if needed.
  • I updated the wizard if needed.
  • Review from the native team if needed.
  • No breaking change or entry added to the changelog.
  • No breaking change for hybrid SDKs or communicated to hybrid SDKs.

🔮 Next steps

Separate PR: replace the per-view getLocationOnScreen (O(N·depth)) with point-transform-during-descent (O(N)), the actual CPU hotspot in this path.

Replace the per-gesture LinkedList BFS queue with an ArrayDeque in
ViewUtils.findTarget and ComposeGestureTargetLocator, and drop the
intermediate list allocated when enqueuing Compose children.

LinkedList allocates a node object per element on every tap and scroll
start; ArrayDeque is array-backed and allocates almost nothing per
element. Traversal behavior is unchanged.

Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>
@linear-code

linear-code Bot commented Jun 22, 2026

Copy link
Copy Markdown

JAVA-534

@sentry

sentry Bot commented Jun 22, 2026

Copy link
Copy Markdown

📲 Install Builds

Android

🔗 App Name App ID Version Configuration
SDK Size io.sentry.tests.size 8.44.1 (1) release

⚙️ sentry-android Build Distribution Settings

@github-actions

Copy link
Copy Markdown
Contributor

Performance metrics 🚀

  Plain With Sentry Diff
Startup time 318.31 ms 361.86 ms 43.54 ms
Size 0 B 0 B 0 B

Baseline results on branch: main

Startup times

Revision Plain With Sentry Diff
18c0bc2 306.73 ms 349.77 ms 43.03 ms
0eaac1e 316.82 ms 357.34 ms 40.52 ms
d15471f 303.49 ms 439.08 ms 135.59 ms
fc5ccaf 276.52 ms 370.46 ms 93.93 ms
e2dce0b 308.96 ms 360.10 ms 51.14 ms
5b1a06b 352.27 ms 413.70 ms 61.43 ms
37ec571 366.04 ms 424.28 ms 58.23 ms
9fbb112 361.43 ms 427.57 ms 66.14 ms
bbc35bb 324.88 ms 425.73 ms 100.85 ms
ff8eea4 313.42 ms 337.08 ms 23.66 ms

App size

Revision Plain With Sentry Diff
18c0bc2 1.58 MiB 2.13 MiB 557.33 KiB
0eaac1e 1.58 MiB 2.19 MiB 619.17 KiB
d15471f 1.58 MiB 2.13 MiB 559.54 KiB
fc5ccaf 1.58 MiB 2.13 MiB 557.54 KiB
e2dce0b 0 B 0 B 0 B
5b1a06b 0 B 0 B 0 B
37ec571 0 B 0 B 0 B
9fbb112 1.58 MiB 2.11 MiB 539.18 KiB
bbc35bb 1.58 MiB 2.12 MiB 553.01 KiB
ff8eea4 1.58 MiB 2.28 MiB 718.64 KiB

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

None yet

Projects

None yet

Development

Successfully merging this pull request may close these issues.

1 participant